#include <bits/stdc++.h>
using namespace std;
const int P = 998244353;

long long ppow(long long x, long long n) {
  long long res = 1;
  while (n > 0) {
    if (n & 1) {
      res = res * x % P;
    }
    x = x * x % P;
    n >>= 1;
  }
  return res;
}

/* long long inv(long long x) { return ppow(x, P - 2); } */

/*超时了
组合数公式C(n, m) = n!/(m!(n-m)!)
被分解为连乘形式：n*(n-1)...(n-m+1)/(1*2...*m)

*/
/*
long long comb(long long n, long long m) {
  if (m < 0 || m > n)
    return 0; // 添加边界检查
  long long res = 1;
  for (long long i = 1; i <= m; i++) {
    res = res * (n - i + 1) % P;
    res = res * inv(i) % P;
  }
  return res;
}

 */
long long factorial[4000005];
long long inv[4000005];


void precompute_factorials(int n) {
  factorial[0] = 1;
  for (int i = 1; i <= n; i++) {
    factorial[i] = factorial[i - 1] * i % P;
  }

  inv[n] = ppow(factorial[n], P - 2);
  for (int i = n - 1; i >= 0; i--) {
    inv[i] = inv[i + 1] * (i + 1) % P;
  }
}


/*
计算公式：使用预处理好的阶乘数组factorial和逆元数组inv，按照组合数公式计算：
C(n,m) = n! / (m! * (n-m)!) 由于模运算中除法要用乘法逆元代替，所以转换为：
C(n,m) ≡ n! * inv(m!) * inv((n-m)!) mod P
*/

long long comb2(int n, int m) {
  if (m < 0 || m > n)
    return 0; // 添加边界检查
  return factorial[n] * inv[m] % P * inv[n - m] % P;
}



int main() {
  //   cout << pow(2, 3) << endl;  // 测试快速幂函数
  //   cout << inv(4) << endl;     // 测试乘法逆元函数
  //   cout << comb(5, 2) << endl; // 测试组合数函数

  int a, o, b, g;
  cin >> a >> o >> b >> g;
  int n = a + o + b + g;

  precompute_factorials(n); // 预处理阶乘和逆元
  long long ans = 0;

  // 枚举最后一个苹果的位置
  //,先放苹果和橘子部分，再放橘子和香蕉部分，再放葡萄和香蕉部分

  // 枚举最后一个苹果的位置
  for (int t = a; t <= a + o; t++) {
    // ans += comb(t - 1, a - 1) * comb(n - t, b) % P;
    ans = (ans + comb2(t - 1, a - 1) * comb2(n - t, b)) % P;
  }

  cout << ans << endl;
  return 0;
}